class Solution {
public:
/*
  // 滑动窗口 + 哈希
    int totalFruit(vector<int>& fruits) {
        unordered_map<int, int> backet; // 哈希记录水果种类与对应个数
        int maxFruits = 0, fruitsNum = 0;
        int left = 0;
        for(int right = 0; right < fruits.size(); ++right){
            ++backet[fruits[right]];
            ++fruitsNum;
            while(backet.size() > 2){
                backet[fruits[left]]--;
                if(0 == backet[fruits[left]]) 
                    backet.erase(fruits[left]);
                --fruitsNum;
                ++left;
            }
            maxFruits = maxFruits<fruitsNum ? fruitsNum : maxFruits;
        }
        return maxFruits;
    }
    */
  /** 如果fruits[right]不是其中的就更新新的数为基准将left直接移动到right前面一格，然后再向前找left相等的最前面的定位left。 ··如果fruits[right]是其中的就更新maxFruits  **/
  // 滑动窗口
    int totalFruit(vector<int>& fruits) {
        int maxFruits = -1;       
        int left = 0, right = 0;
        int b1 = fruits[left], b2 = fruits[right];
        while(right < fruits.size()){
            if(b2 == fruits[right] || b1 == fruits[right]) {
                maxFruits = max(maxFruits, right-left+1);
                ++right;
            }  
            else{
                left = right - 1;   // 更新左值
                b1 = fruits[left];
                // 左指针慢慢回退齐所有的连续同类
                while(left > 0 && fruits[left-1] == b1)
                    --left;
                b2 = fruits[right];
                maxFruits = max(maxFruits, right-left+1);
            }
            
        }

        return maxFruits;
    }


};